#include <iostream>
#include <cstring>
using namespace std;
const int N = 20;
int a[N];
int t[N];
int n;

// 判断x->y是否合法,表示0->1的次数，-1为不合法
int calc(int x, int y)
{
    int sum = 0;
    for(int i = 0;i < n;i++)
    {
        // 0->1
        if(((x >> i) & 1) == 0 && ((y >> i) & 1) == 1) sum++;
        // 1->0
        if(((x >> i) & 1) == 1 && ((y >> i) & 1) == 0) return -1;
    }
    return sum;
}

int solve()
{
    int ret = 0x3f3f3f3f;
    // 枚举第一行所有状态
    for(int st = 0;st < (1 << n);st++)
    {
        memcpy(t, a, sizeof a);
        int cnt = 0; // 统计0->1的次数
        int change = st;
        bool flag = 1;
        // 接下来几行的状态
        for(int i = 1;i <= n;i++)
        {
            // 判断当前状态是否合法
            int c = calc(t[i], change);
            if(c == -1)
            {
                flag = 0;
                break;
            }
            cnt += c;
            t[i] = change;
            // 计算下一行的状态
            change = t[i - 1] ^ (t[i] << 1) ^ (t[i] >> 1);
            // 消除影响
            change &= (1 << n) - 1;
        }
        if(flag) ret = min(ret, cnt);
    }
    if(ret == 0x3f3f3f3f) ret = -1;
    return ret;
}

int main()
{
    int T;
    cin >> T;
    for(int k = 1;k <= T;k++)
    {
        cin >> n;
        memset(a, 0, sizeof a);
        for(int i = 1;i <= n;i++) // 避免越界访问
        {
            for(int j = 0;j < n;j++)
            {
                int x;
                cin >> x;
                if(x == 1) a[i] |= 1 << j;
            }
        }

        printf("Case %d: %d\n", k, solve());
    }
    return 0;
}